From 5583695da76991e34ebe93aca619c7aee94386de Mon Sep 17 00:00:00 2001 From: tsteven4 Date: Thu, 7 Dec 2017 10:39:24 -0700 Subject: [PATCH] update to google maps api v3. --- gui/gmapbase.html | 553 +++++++++++++--------------------------------- gui/map.cc | 164 +++++++------- 2 files changed, 243 insertions(+), 474 deletions(-) diff --git a/gui/gmapbase.html b/gui/gmapbase.html index 39d008eb8..73a14f534 100644 --- a/gui/gmapbase.html +++ b/gui/gmapbase.html @@ -4,412 +4,167 @@ Google Maps JavaScript - + + - +
diff --git a/gui/map.cc b/gui/map.cc index 9ea04d665..d384a1f60 100644 --- a/gui/map.cc +++ b/gui/map.cc @@ -27,8 +27,10 @@ #include #if HAVE_WEBENGINE #include +#include #include #else +#include #include #include #endif @@ -73,21 +75,22 @@ Map::Map(QWidget *parent, #if HAVE_WEBENGINE MarkerClicker *mclicker = new MarkerClicker(this); - QWebChannel* channel = new QWebChannel(this); + QWebChannel* channel = new QWebChannel(this->page()); this->page()->setWebChannel(channel); + // Note: A current limitation is that objects must be registered before any client is initialized. channel->registerObject(QStringLiteral("mclicker"), mclicker); connect(mclicker, SIGNAL(markerClicked(int, int )), this, SLOT(markerClicked(int, int))); connect(mclicker, SIGNAL(logTime(const QString &)), this, SLOT(logTime(const QString &))); #endif - QString baseFile = QApplication::applicationDirPath() + "/gmapbase.html"; + QString baseFile = QApplication::applicationDirPath() + "/gmapbasev3.html"; if (!QFile(baseFile).exists()) { QMessageBox::critical(0, appName, tr("Missing \"gmapbase.html\" file. Check installation")); } else { QString urlStr = "file:///" + baseFile; - load(QUrl(urlStr)); + this->load(QUrl(urlStr)); } } @@ -138,7 +141,7 @@ static QStringList makeLiteralVar(const QString &name, const string &s) //------------------------------------------------------------------------ static QString fmtLatLng(const LatLng &l) { - return QString("%1, %3").arg(l.lat(), 0, 'f', 5) .arg(l.lng(), 0, 'f', 5); + return QString("{lat: %1, lng: %3}").arg(l.lat(), 0, 'f', 5) .arg(l.lng(), 0, 'f', 5); } //------------------------------------------------------------------------ @@ -146,6 +149,7 @@ void Map::showGpxData() { #if !defined(HAVE_WEBENGINE) + // Historically this was done here in showGpxData. MarkerClicker *mclicker = new MarkerClicker(this); this->page()->mainFrame()->addToJavaScriptWindowObject("mclicker", mclicker); connect(mclicker, SIGNAL(markerClicked(int, int )), this, SLOT(markerClicked(int, int))); @@ -160,21 +164,22 @@ void Map::showGpxData() this->logTime("Start defining JS string"); QStringList scriptStr; scriptStr - << "mclicker.logTimeX(\"Start JS execution\");" - << "var map = new GMap2(document.getElementById(\"map\"));" - << "var bounds = new GLatLngBounds;" + << "//mclicker.logTimeX(\"Start JS execution\");" + << "var map = new google.maps.Map(document.getElementById(\"map\"));" + << "var bounds = new google.maps.LatLngBounds();" << "var waypts = [];" << "var rtes = [];" << "var trks = [];" - << "map.enableScrollWheelZoom();" - << "map.enableContinuousZoom();" - << "map.addControl(new GLargeMapControl());" - << "map.addControl(new GScaleControl());" - << "map.addControl(new GMapTypeControl());" - << "var pn = map.getPane(G_MAP_MARKER_PANE);" - << "pn.style.KhtmlUserSelect='none';" - << "pn.style.KhtmlUserDrag='none';" - << "mclicker.logTimeX(\"Done prelim JS definition\");" + << "var idx;" + << "//map.enableScrollWheelZoom();" + << "//map.enableContinuousZoom();" + << "//map.addControl(new GLargeMapControl());" + << "//map.addControl(new GScaleControl());" + << "//map.addControl(new GMapTypeControl());" + << "//var pn = map.getPane(G_MAP_MARKER_PANE);" + << "//pn.style.KhtmlUserSelect='none';" + << "//pn.style.KhtmlUserDrag='none';" + << "//mclicker.logTimeX(\"Done prelim JS definition\");" << QString("var zoomFactor = %1;").arg(zoomFactor) << QString("var numLevels = %1;").arg(numLevels) ; @@ -185,8 +190,8 @@ void Map::showGpxData() int num=0; foreach (const GpxWaypoint &pt, gpx_.getWaypoints() ) { scriptStr - << QString("waypts[%1] = new GMarker(new GLatLng(%2), " - "{title:\"%3\",icon:blueIcon});") + << QString("waypts[%1] = new google.maps.Marker({map: map, position: %2, " + "title: \"%3\", icon: blueIcon});") .arg(num) .arg(fmtLatLng(pt.getLocation())) .arg(stripDoubleQuotes(pt.getName())); @@ -194,86 +199,85 @@ void Map::showGpxData() } scriptStr - << "for( var i=0; i epts; + vector pts; + QString path; foreach (const GpxTrackSegment seg, trk.getTrackSegments()) { foreach (const GpxTrackPoint pt, seg.getTrackPoints()) { - epts.push_back(pt.getLocation()); + pts.push_back(pt.getLocation()); } } - string encPts, encLevels; - encoder.dpEncode(encPts, encLevels, epts); + // maps v3 Polylines do not use encoded paths. + foreach (const LatLng ll, pts) { + path.append(fmtLatLng(ll)); + path.append(QLatin1String(", ")); + } + path.chop(2); scriptStr - << QString("var startPt = new GLatLng(%1);").arg(fmtLatLng(epts[0])) - << QString("var endPt = new GLatLng(%1);").arg(fmtLatLng(epts[epts.size()-1])) - << QString("var idx = %1;").arg(num) - << QString("var nm = \"%1\";").arg(stripDoubleQuotes(trk.getName())) - << makeLiteralVar("encpts", encPts) - << makeLiteralVar("enclvs", encLevels) - - << "var trk = GPolyline.fromEncoded({color:\"#0000E0\", weight:2, opacity:0.6," - << "points:encpts, zoomFactor:zoomFactor, levels:enclvs, numLevels:numLevels});" - << "trks[idx] = new RTPolyline(trk, startPt, endPt, new MarkerHandler(1, idx));" + << QString("trks[%1] = new RTPolyline(\n" + " map,\n" + " new google.maps.Polyline({map: map, strokeColor: \"#0000E0\", strokeWeight: 2, strokeOpacity: 0.6, path: [%2]}),\n" + " new google.maps.LatLng(%3),\n" + " new google.maps.LatLng(%4),\n" + " \"%5\",\n" + " new MarkerHandler(1, %1)\n);" + ).arg(num).arg(path).arg(fmtLatLng(pts.front())).arg(fmtLatLng(pts.back())).arg(stripDoubleQuotes(trk.getName())) + << QString("bounds.union(trks[%1].getBounds());").arg(num) ; num++; } scriptStr - << "for( var i=0; i epts; + vector pts; + QString path; foreach (const GpxRoutePoint &pt, rte.getRoutePoints()) { - epts.push_back(pt.getLocation()); + pts.push_back(pt.getLocation()); + } + // maps v3 Polylines do not use encoded paths. + foreach (const LatLng ll, pts) { + path.append(fmtLatLng(ll)); + path.append(QLatin1String(", ")); } - string encPts, encLevels; - encoder.dpEncode(encPts, encLevels, epts); + path.chop(2); + scriptStr - << QString("var startPt = new GLatLng(%1);").arg(fmtLatLng(epts[0])) - << QString("var endPt = new GLatLng(%1);").arg(fmtLatLng(epts[epts.size()-1])) - << QString("var idx = %1;").arg(num) - << QString("var nm = \"%1\";").arg(stripDoubleQuotes(rte.getName())) - << makeLiteralVar("encpts", encPts) - << makeLiteralVar("enclvs", encLevels) - << "var rte = GPolyline.fromEncoded({color:\"#8000B0\", weight:2, opacity:0.6," - << " points:encpts, zoomFactor:zoomFactor, levels:enclvs, numLevels:numLevels});" - << "rtes[idx] = new RTPolyline(rte, startPt, endPt, new MarkerHandler(2, idx));" + << QString("rtes[%1] = new RTPolyline(\n" + " map,\n" + " new google.maps.Polyline({map: map, strokeColor: \"#0000E0\", strokeWeight: 2, strokeOpacity: 0.6, path: [%2]}),\n" + " new google.maps.LatLng(%3),\n" + " new google.maps.LatLng(%4),\n" + " \"%5\",\n" + " new MarkerHandler(2, %1)\n);" + ).arg(num).arg(path).arg(fmtLatLng(pts.front())).arg(fmtLatLng(pts.back())).arg(stripDoubleQuotes(rte.getName())) + << QString("bounds.union(rtes[%1].getBounds());").arg(num) ; num++; } scriptStr - << "for( var i=0; ilogTime("Done defining JS string"); @@ -326,12 +330,13 @@ void Map::hideAllTracks() } //------------------------------------------------------------------------ +// TACKY: we assume the waypoints list and JS waypts[] are parallel. void Map::showWaypoints(const QList &waypoints) { QStringList scriptStr; int i=0; foreach(const GpxWaypoint &pt, waypoints) { - scriptStr << QString("waypts[%1].%2();").arg(i++).arg(pt.getVisible()?"show":"hide"); + scriptStr << QString("waypts[%1].setVisible(%2);").arg(i++).arg(pt.getVisible()?"true":"false"); } evaluateJS(scriptStr); } @@ -341,7 +346,7 @@ void Map::hideAllWaypoints() QStringList scriptStr; scriptStr << "for( var i=0; ipage()->runJavaScript(s); #else -- 2.30.2